# ======================== Elasticsearch Configuration =========================
#
# NOTE: Elasticsearch comes with reasonable defaults for most settings.
#       Before you set out to tweak and tune the configuration, make sure you
#       understand what are you trying to accomplish and the consequences.
#
# The primary way of configuring a node is via this file. This template lists
# the most important settings you may want to configure for a production cluster.
#
# Please consult the documentation for further information on configuration options:
# https://www.elastic_co/guide/en/elasticsearch/reference/index.html
#
# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#
cluster.name: {{ elastic_cluster_name }}
#
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
node.name: {{ inventory_hostname }}
#
# Add custom attributes to the node:
#
{% if ('esHots' in group_names) or (groups['esDatas']|length < 1) %}
# Hot nodes store newest data, it should use local SSD storage for performance
node.attr.box_type: hot
{% elif 'esWarms' in group_names %}
# Warm nodes store outdate data, it can use large but slow storage.
node.attr.box_type: warm
{% endif %}

# Role of the node in cluster:
#
{% for item in elastic_all_roles %}
{% if groups['esDatas']|length < 1 %}
node.{{ item }}: true
{% elif item not in elastic_instance_roles %}
node.{{ item }}: false
{% endif %}
{% endfor %}
search.remote.connect: {{ search_remote_connect }}

# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
path.data:
{% for path in elastic_data_paths %}
  - {{ path }}
{% endfor %}
#
# Path to log files:
#
path.logs: {{ elastic_log_path }}
#
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
bootstrap.memory_lock: true
#
# Make sure that the heap size is set to about half the memory available
# on the system and that the owner of the process is allowed to use this
# Make sure that the heap size is set to about half the memory available
# on the system and that the owner of the process is allowed to use this
# limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: _{{ bind_interface }}_
network.bind_host: {{ bind_address }}

network.publish_host: {{ bind_address }}

transport.host: _{{ bind_interface }}_
transport.bind_host: {{ bind_address }}

#
# Set a custom port for HTTP:
#
http.port: {{ elastic_http_port }}
#
# For more information, consult the network module documentation.
#
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when new node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
discovery.zen.ping.unicast.hosts:
{% for item in groups['esMasters'] %}
  - "{{ item }}.node.{{ consul_dc_name }}.consul"
{% endfor %}
#
# Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):
#
{% if groups.elasticsearch|count() >= 3 %}
discovery.zen.minimum_master_nodes: {{ groups.esMasters|count() // 2 + 1 }}
{% else %}
discovery.zen.minimum_master_nodes: 1
{% endif %}
#
# For more information, consult the zen discovery module documentation.
#
# ---------------------------------- Gateway -----------------------------------
#
# Block initial recovery after a full cluster restart until N nodes are started:
#
{% if groups.elasticsearch|count() > 2 %}
gateway.recover_after_nodes: {{ groups.esMasters|count() // 2 + 1 }}
{% else %}
gateway.recover_after_nodes: 1
{% endif %}
#
# For more information, consult the gateway module documentation.
#
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true
